#include <REGX52.H>

sbit DS1302_SCLK = P3^6;
sbit DS1302_IO = P3^4;
sbit DS1302_CE = P3^5;
#define DS1302_Seconds 0x80//秒
#define DS1302_Minutes 0x82//分
#define DS1302_Hour    0x84//小时
#define DS1302_Date    0x86//日
#define DS1302_Month   0x88//月
#define DS1302_Day     0x8A//星期
#define DS1302_Year    0x8C//年
#define DS1302_MP      0x8E//写保护更改

//年//月//日//小时//分钟//秒//星期
unsigned char DS1302_Time [] ={23,12,9,10,23,0,6};

void DS1302_Init(void)
{
	DS1302_CE = 0;
	DS1302_SCLK = 0;
}

//写入函数
//Comand为输入的命令（0x80为写秒(0-59)，0x82为写分(0-59)，0x84为写小时(0-23/0-12)，0x86为写日(1-31)，
//0x88为写月(1-12)，0x8A为写星期(1-7)，0x8C为写年(0-99),0x8E为0x80时写入保护）

//Date为输入内容
void DS1302_Writebyte(unsigned char Command,unsigned char Data)
{
	unsigned char i = 0;
	DS1302_CE=1;
	//输入命令
	for(i=0;i<8;i++)//IO口只能一位一位读取
	{
		DS1302_IO=Command&(0x01<<i);//从低到高一位一位写入
		//模拟时序
		DS1302_SCLK=1;
		DS1302_SCLK=0;
	}
	//输入内容
	for(i=0;i<8;i++)
	{
		DS1302_IO=Data&(0x01<<i);//从低到高一位一位输入
		DS1302_SCLK=1;
		DS1302_SCLK=0;
	}
	DS1302_CE=0;
}

//读出函数
//Commadn为选择输出命令（0x81为读秒(0-59)，0x83为读分(0-59)，0x85为读小时(0-23/0-12)，0x87为读日(1-31)，
//0x89为读月(1-12)，0x8B为读星期(1-7)，0x8D为读年(0-99),0x8F为0x80时写入保护）
//(0X80时输入0x80（1000 0000）时时钟暂停）
//（0x84时输入0x80是12小时的输入0x00是24小时）
unsigned char DS1302_ReadByte(unsigned char Commadn)
{
	unsigned char Data=0;
	unsigned char i = 0;	
	Commadn|=0x01;//当使用宏时将写命令的0位改为1更改为读命令
	DS1302_CE=1;
	//输入命令
	for(i=0;i<8;i++)
	{
		DS1302_IO=Commadn&(0x01<<i);//从低到高一位一位输入
		DS1302_SCLK=0;
		DS1302_SCLK=1;
	}
	//读取数据
	for(i=0;i<8;i++)
	{
		//模拟输入时序
		DS1302_SCLK=1;
		DS1302_SCLK=0;
		if(DS1302_IO!=0)
		{
			Data|=(0x01<<i);//从低到高一位一位读取
		}
	}
	DS1302_CE=0;
	DS1302_IO=0;
	return Data;
}
//读时间
 void DS1302_Read_Time(void)
 {
	 unsigned char x=0;
	 //x/16*10+x%16将读取的时间从BCD码转换成十进制数存放到数组
	 x = DS1302_ReadByte(DS1302_Year);
	 DS1302_Time[0]=x/16*10+x%16;
	 x = DS1302_ReadByte(DS1302_Month);
	 DS1302_Time[1]=x/16*10+x%16;
	 x = DS1302_ReadByte(DS1302_Date);
	 DS1302_Time[2]=x/16*10+x%16;
	 x = DS1302_ReadByte(DS1302_Hour);
	 DS1302_Time[3]=x/16*10+x%16;
	 x = DS1302_ReadByte(DS1302_Minutes);
	 DS1302_Time[4]=x/16*10+x%16;
	 x = DS1302_ReadByte(DS1302_Seconds);
	 DS1302_Time[5]=x/16*10+x%16;
	 x = DS1302_ReadByte(DS1302_Day);
	 DS1302_Time[6]=x/16*10+x%16;
 }

 //写时间
 
 void DS1302_Write_Time(void)
 {
	 DS1302_Writebyte(DS1302_MP,0x00);//关闭写保护
	 //从数组写入DS1302_Time[0]/10*16+DS1302_Time[0]%10是将数组中十进制数转换为BCD码
	 DS1302_Writebyte(DS1302_Year,DS1302_Time[0]/10*16+DS1302_Time[0]%10);
	 DS1302_Writebyte(DS1302_Month,DS1302_Time[1]/10*16+DS1302_Time[1]%10);
	 DS1302_Writebyte(DS1302_Date,DS1302_Time[2]/10*16+DS1302_Time[2]%10);
	 DS1302_Writebyte(DS1302_Hour,DS1302_Time[3]/10*16+DS1302_Time[3]%10);
	 DS1302_Writebyte(DS1302_Minutes,DS1302_Time[4]/10*16+DS1302_Time[4]%10);
	 DS1302_Writebyte(DS1302_Seconds,DS1302_Time[5]/10*16+DS1302_Time[5]%10);
	 DS1302_Writebyte(DS1302_Day,DS1302_Time[6]/10*16+DS1302_Time[6]%10);
	 DS1302_Writebyte(DS1302_MP,0x80);//打开写保护
 }

